/*
 * Copyright (c) 2012 SUBSECRETARIA DEFENSORIA DEL ESPACIO PUBLICO - SDEP.
 * All Rights Reserved.
 * This software is the confidential and proprietary information of SDEP
 * Developed By CONSTULT-SOFT S.A, Development Team 2012.
 * 
 */
package co.gov.medellin.sdep.sisdep.model.dao.impl;

import java.math.BigDecimal;
import java.sql.Date;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.springframework.transaction.PlatformTransactionManager;

import co.gov.medellin.sdep.sisdep.common.OracleHelper;
import co.gov.medellin.sdep.sisdep.model.Carne;
import co.gov.medellin.sdep.sisdep.model.dao.CarneDAOImpl;


/**
 * <p>
 * Implementacion de los metodos especializados de acceso a datos, necesarios para la gestion de los Carne de los 
 * Comerciantes en SISDEP.
 * </p>
 * <p>
 * Copyright (c) 2012<BR>
 * Consult-Soft S.A.<BR>
 * Created on: Apr 05, 2012<BR>
 * 
 * @author atabares
 * </p>
 */
public class CarneDAOTImpl extends CarneDAOImpl implements ICarneDAOT {

	/** Manejador de transacciones para CarneDAOTImpl */
	private PlatformTransactionManager transactionManager;
	

	/**
	 * Constructor por defecto
	 */
	public CarneDAOTImpl() {
	}
	
	/**
	* Obtiene el parametro transactionManager.
	* @see CarneDAOTImpl#transactionManager
	*
	* @return El parametro transactionManager.
	*/
	public PlatformTransactionManager getTransactionManager() {
		return transactionManager;
	}

	/**
	* Asigna el parametro transactionManager.
	* @see CarneDAOTImpl#transactionManager
	*
	* @param transactionManager valor a asignar al parametro transactionManager.
	*/
	public void setTransactionManager(PlatformTransactionManager transactionManager) {
		this.transactionManager = transactionManager;
	}
	
	/* (non-Javadoc)
	 * @see co.gov.medellin.sdep.sisdep.model.dao.impl.ICarneDAOT#getCarneListByCriteria(co.gov.medellin.sdep.sisdep.model.Carne)
	 */
	public List getCarneListByCriteria(Carne carne) {
		
		StringBuffer query = new StringBuffer();
		
		query.append("SELECT DISTINCT CAR.ID, CAR.CODIGO, CAR.TIPO, PER.IDENTIFICACION, CAR.ASOCIACION, ");
		query.append("CAR.NUMERO, CAR.BARRIO, CAR.COMUNA, CAR.ID_TIPOLOGIA, CAR.ID_TIPO_VENTA, ");
		query.append("CAR.ID_TIPO_AMOBLAMIENTO, CAR.ESTADO, CAR.COPIA, CAR.FECHA_EXPEDICION ");
		query.append("FROM REG_CARNE_T CAR ");
		query.append("JOIN ADM_PERSONA_T PER ON ID_PERSONA = PER.ID ");
		
		if (carne.getIdPersona() != null) {
            query.append("AND PER.IDENTIFICACION = ? ");
        }
		
		if (!OracleHelper.isNullorEmpty(carne.getNumero())) {
            query.append("WHERE CAR.NUMERO = ? ");
        }
		
		query.append(" ORDER BY CAR.FECHA_EXPEDICION");
		
		List params = new ArrayList();
		
		if (carne.getIdPersona() != null) {
			params.add(carne.getIdPersona());
        }
		
		if (!OracleHelper.isNullorEmpty(carne.getNumero())) {
			params.add(carne.getNumero());
        }
		
    	List rows = this.getJdbcTemplate().queryForList(query.toString(), params.toArray());
		
    	List carneList = new ArrayList();
    	Iterator iterator = rows.iterator();
    	
    	while (iterator.hasNext()) {
    		Map carneMap = (Map) iterator.next();
    		
    		Carne carneTemp = new Carne();
    		
    		carneTemp.setId(new Long(((BigDecimal) carneMap.get("ID")).longValue()));
			carneTemp.setCodigo((String) carneMap.get("CODIGO"));
			carneTemp.setTipo((String) carneMap.get("TIPO"));
			carneTemp.setDocPersona((String) carneMap.get("IDENTIFICACION"));
			carneTemp.setAsociacion((String) carneMap.get("ASOCIACION"));
			carneTemp.setNumero((String) carneMap.get("NUMERO"));
			carneTemp.setBarrio((String) carneMap.get("BARRIO"));
			carneTemp.setComuna((String) carneMap.get("COMUNA"));
			carneTemp.setIdTipologia(new Long(((BigDecimal) carneMap.get("ID_TIPOLOGIA")).longValue()));
			carneTemp.setIdTipoVenta(new Long(((BigDecimal) carneMap.get("ID_TIPO_VENTA")).longValue()));
			carneTemp.setIdTipoAmoblamiento(new Long(((BigDecimal) carneMap.get("ID_TIPO_AMOBLAMIENTO")).longValue()));
			carneTemp.setEstado((String) carneMap.get("ESTADO"));
			carneTemp.setCopia((String) carneMap.get("COPIA"));
			carneTemp.setFechaExpedicion(new Date(((Timestamp) carneMap.get("FECHA_EXPEDICION")).getTime()));
			
			carneList.add(carneTemp);
    	}
		
		return carneList;
	}

	/* (non-Javadoc)
	 * @see co.gov.medellin.sdep.sisdep.model.dao.impl.ICarneDAOT#deliveryCarne(java.lang.String)
	 */
	public void deliveryCarne(Carne carne) {

		StringBuffer query = new StringBuffer();
		
		query.append("UPDATE REG_CARNE_T SET ESTADO = ?, FECHA_ENTREGA = SYSDATE, OBSERVACION = ?,");
		query.append("USUARIO_MODIFICA = ?, FECHA_MODIFICA = SYSDATE ");
		query.append("WHERE ID = ? ");
		
		List params = new ArrayList();
		
		params.add(carne.getEstado());
		params.add(carne.getObservacion());
		params.add(carne.getUsuarioModifica());
		params.add(carne.getId());
		
		this.getJdbcTemplate().update(query.toString(), params.toArray());
	}
	
}
